package com;

import javax.faces.bean.ManagedBean;
import javax.enterprise.context.SessionScoped;
import java.sql.*;
import javax.sql.DataSource;
import javax.annotation.Resource;
import com.br.util.FonteConexoes;

@ManagedBean(name="inserirTabulacao")
@SessionScoped
public class InserirTabulacaoBean
{
    public static final String erro_conexao = "0";

    public static final String erro_login = "1";

    public static final String erro_interno = "2";

    public static final String sucesso = "3";
    
    public static final String interrompida = "4";
    
    private String id_respt = "";
    
    private String id_produto = "";
    
    private String id_entreposto = "";
    
    private String id_classific = "";
    
    private String id_tipo_caixa = "";
    
    private String id_qtde_caixa = "";
    
    private String id_resp_col = "";
    
    private String id_resp_col2 = "";
    
    private String data_col = "";
    
    private String precos_caixa = "";
    
    private String precos_unidade = "";
    
    private String preco_max_c = "";
    
    private String preco_max_u = "";
    
    private String preco_min_c = "";
    
    private String preco_min_u = "";
    
    private String media_caixa = "";
    
    private String media_unidade = "";
    
    private String moda_caixa = "";
    
    private String moda_unidade = "";
    
    private String mediana_caixa = "";
    
    private String mediana_unidade = "";

    public String getData_col() {
        return data_col;
    }

    public void setData_col(String data_col) {
        this.data_col = data_col;
    }

    public String getId_classific() {
        return id_classific;
    }

    public void setId_classific(String id_classific) {
        this.id_classific = id_classific;
    }

    public String getId_entreposto() {
        return id_entreposto;
    }

    public void setId_entreposto(String id_entreposto) {
        this.id_entreposto = id_entreposto;
    }

    public String getId_produto() {
        return id_produto;
    }

    public void setId_produto(String id_produto) {
        this.id_produto = id_produto;
    }

    public String getId_qtde_caixa() {
        return id_qtde_caixa;
    }

    public void setId_qtde_caixa(String id_qtde_caixa) {
        this.id_qtde_caixa = id_qtde_caixa;
    }

    public String getId_resp_col() {
        return id_resp_col;
    }

    public void setId_resp_col(String id_resp_col) {
        this.id_resp_col = id_resp_col;
    }

    public String getId_resp_col2() {
        return id_resp_col2;
    }

    public void setId_resp_col2(String id_resp_col2) {
        this.id_resp_col2 = id_resp_col2;
    }

    public String getId_respt() {
        return id_respt;
    }

    public void setId_respt(String id_respt) {
        this.id_respt = id_respt;
    }

    public String getId_tipo_caixa() {
        return id_tipo_caixa;
    }

    public void setId_tipo_caixa(String id_tipo_caixa) {
        this.id_tipo_caixa = id_tipo_caixa;
    }

    public String getMedia_caixa() {
        return media_caixa;
    }

    public void setMedia_caixa(String media_caixa) {
        this.media_caixa = media_caixa;
    }

    public String getMedia_unidade() {
        return media_unidade;
    }

    public void setMedia_unidade(String media_unidade) {
        this.media_unidade = media_unidade;
    }

    public String getMediana_caixa() {
        return mediana_caixa;
    }

    public void setMediana_caixa(String mediana_caixa) {
        this.mediana_caixa = mediana_caixa;
    }

    public String getMediana_unidade() {
        return mediana_unidade;
    }

    public void setMediana_unidade(String mediana_unidade) {
        this.mediana_unidade = mediana_unidade;
    }

    public String getModa_caixa() {
        return moda_caixa;
    }

    public void setModa_caixa(String moda_caixa) {
        this.moda_caixa = moda_caixa;
    }

    public String getModa_unidade() {
        return moda_unidade;
    }

    public void setModa_unidade(String moda_unidade) {
        this.moda_unidade = moda_unidade;
    }

    public String getPreco_max_c() {
        return preco_max_c;
    }

    public void setPreco_max_c(String preco_max_c) {
        this.preco_max_c = preco_max_c;
    }

    public String getPreco_max_u() {
        return preco_max_u;
    }

    public void setPreco_max_u(String preco_max_u) {
        this.preco_max_u = preco_max_u;
    }

    public String getPreco_min_c() {
        return preco_min_c;
    }

    public void setPreco_min_c(String preco_min_c) {
        this.preco_min_c = preco_min_c;
    }

    public String getPreco_min_u() {
        return preco_min_u;
    }

    public void setPreco_min_u(String preco_min_u) {
        this.preco_min_u = preco_min_u;
    }

    public String getPrecos_caixa() {
        return precos_caixa;
    }

    public void setPrecos_caixa(String precos_caixa) {
        this.precos_caixa = precos_caixa;
    }

    public String getPrecos_unidade() {
        return precos_unidade;
    }

    public void setPrecos_unidade(String precos_unidade) {
        this.precos_unidade = precos_unidade;
    }
    
    public String executarInsercao()
    {
        Connection conexao = null;
        boolean commited = false; // por padrão, consideramos que o commit não acontecerá
        Savepoint antesInsercao; // savepoint antes da inserção; caso houver algum problema, voltamos para este ponto
        
        if (id_respt.equals(""))
        {
            return interrompida;
        }
        
        try
            {
                conexao = new FonteConexoes().getConnection();
                antesInsercao = conexao.setSavepoint();
                
            } catch(Exception e)
            {
                return interrompida;
            }
        
        try
        {
            String sqlInserirTabul = "INSERT INTO tabulacoes("
            + "id_prod, id_entr, id_clas, id_tipoc, id_qtdec, id_respc,"
            + "id_respc2, id_respt, datac_tabu, datat_tabu, status_tabu) VALUES("
            + "?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)";

            conexao.setAutoCommit(false);
            PreparedStatement prepStmtInserirTabul = conexao.prepareStatement(sqlInserirTabul,
                    Statement.RETURN_GENERATED_KEYS);

            prepStmtInserirTabul.setInt(8, Integer.parseInt(id_respt));

            // data_tabul é a data de envio, ou seja, a data de hoje
            java.util.Date dataAtual = new java.util.Date();
            java.sql.Date dataSQL = new java.sql.Date(dataAtual.getTime());
            prepStmtInserirTabul.setDate(10, dataSQL);

            prepStmtInserirTabul.setString(11, "a");
            
            // inserção da tabulação
            prepStmtInserirTabul.setInt(1, Integer.parseInt(id_produto));
            prepStmtInserirTabul.setInt(2, Integer.parseInt(id_entreposto));
            prepStmtInserirTabul.setInt(3, Integer.parseInt(id_classific));
            prepStmtInserirTabul.setInt(4, Integer.parseInt(id_tipo_caixa));
            prepStmtInserirTabul.setInt(5, Integer.parseInt(id_qtde_caixa));
            prepStmtInserirTabul.setInt(6, Integer.parseInt(id_resp_col));
            prepStmtInserirTabul.setInt(7, Integer.parseInt(id_resp_col2));
            prepStmtInserirTabul.setDate(9, Date.valueOf(data_col));
            prepStmtInserirTabul.execute();
            
            // recuperamos o id da tabulação no banco de dados web
            ResultSet rsPrimaryKey = prepStmtInserirTabul.getGeneratedKeys();
            rsPrimaryKey.next();
            int idTabulacaoWeb = rsPrimaryKey.getInt(1);
            
            // separamos os preços de caixa e unidade recebidos por meio das
            // strings precos_caixa e precos_unidade
            
            char[] caracteresPrecosCaixa = precos_caixa.toCharArray();
            char[] caracteresPrecosUnidade = precos_unidade.toCharArray();
            
            int qtdePrecos = 0;
            
            // determinando a quantidade de preços
            for (int i = 0; i < caracteresPrecosCaixa.length; i++)
            {
                if (caracteresPrecosCaixa[i] == '|')
                {
                    qtdePrecos++;
                }
            }
            
            qtdePrecos++;
            
            String[] precosCaixaSeparados = new String[qtdePrecos];
            String[] precosUnidadeSeparados = new String[qtdePrecos];
            
            int precoAtual = 0;
            
            // separando os preços da caixa
            for (int i = 0; i < caracteresPrecosCaixa.length; i++)
            {
                precosCaixaSeparados[precoAtual] = "";
                
                while (caracteresPrecosCaixa[i] != '|')
                {
                    precosCaixaSeparados[precoAtual] += caracteresPrecosCaixa[i];
                    i++;
                    
                    if (i >= caracteresPrecosCaixa.length)
                    {
                        break;
                    }
                }
                
                precoAtual++;
            }
            
            precoAtual = 0;
            
            // separando os preços da unidade
            for (int i = 0; i < caracteresPrecosUnidade.length; i++)
            {
                precosUnidadeSeparados[precoAtual] = "";
                
                while (caracteresPrecosUnidade[i] != '|' && i < caracteresPrecosUnidade.length)
                {
                    precosUnidadeSeparados[precoAtual] += caracteresPrecosUnidade[i];
                    i++;
                    
                    if (i >= caracteresPrecosUnidade.length)
                    {
                        break;
                    }
                }
                
                precoAtual++;
            }
            
            // inserção dos preços da tabulação atual
            String sqlInserirPreco = "INSERT INTO precos("
                    + "id_tabu, valor_caixa_prec, valor_unidade_prec) VALUES(?, ?, ?)";
            PreparedStatement prepStmtPrecos = conexao.prepareStatement(sqlInserirPreco);
            prepStmtPrecos.setInt(1, idTabulacaoWeb);
            
            for (int i = 0; i < qtdePrecos; i++)
            {
                prepStmtPrecos.setFloat(2, Float.parseFloat(precosCaixaSeparados[i]));
                prepStmtPrecos.setFloat(3, Float.parseFloat(precosUnidadeSeparados[i]));
                prepStmtPrecos.execute();
            }

            // inserção das estatísticas da tabulação atual
            String sqlInserirEstatistica = "INSERT INTO estatisticas("
                    + "id_tabu, preco_max_c_esta, preco_max_u_esta, preco_min_c_esta, preco_min_u_esta, media_caixa_esta,"
                    + " media_unidade_esta, moda_caixa_esta, moda_unidade_esta, mediana_caixa_esta, mediana_unidade_esta) VALUES("
                    + "?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)";
            PreparedStatement prepStmtEstatistica = conexao.prepareStatement(sqlInserirEstatistica);
            prepStmtEstatistica.setInt(1, idTabulacaoWeb);
            
            prepStmtEstatistica.setFloat(2, Float.parseFloat(preco_max_c));
            prepStmtEstatistica.setFloat(3, Float.parseFloat(preco_max_u));
            prepStmtEstatistica.setFloat(4, Float.parseFloat(preco_min_c));
            prepStmtEstatistica.setFloat(5, Float.parseFloat(preco_min_u));
            prepStmtEstatistica.setFloat(6, Float.parseFloat(media_caixa));
            prepStmtEstatistica.setFloat(7, Float.parseFloat(media_unidade));
            prepStmtEstatistica.setFloat(8, Float.parseFloat(moda_caixa));
            prepStmtEstatistica.setFloat(9, Float.parseFloat(moda_unidade));
            prepStmtEstatistica.setFloat(10, Float.parseFloat(mediana_caixa));
            prepStmtEstatistica.setFloat(11, Float.parseFloat(mediana_unidade));
            prepStmtEstatistica.execute();
            
            // todas as operações com o banco de dados foram bem sucedidas;
            // por isso, ordenamos o commit
            conexao.commit();
            commited = true;
            
            conexao.close();
            return sucesso;
            
        } catch(Exception e)
        {
            // houve um erro interno; realizamos um rollback no bd web
            try
            {
                if (commited == false)
                {
                    conexao.rollback(antesInsercao);
                }

                conexao.close();
            }
            finally
            {
                return interrompida;
            }
        }
    } 
}

